"""
给定一个数组，它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意: 你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。

输入: [3,3,5,0,0,3,1,4]
输出: 6
解释: 在第 4 天（股票价格 = 0）的时候买入，在第 6 天（股票价格 = 3）的时候卖出，这笔交易所能获得利润 = 3-0 = 3 。
随后，在第 7 天（股票价格 = 1）的时候买入，在第 8 天 （股票价格 = 4）的时候卖出，这笔交易所能获得利润 = 4-1 = 3 。

类似动态规划
将数组分为两个部分
一个存从前往后所有的最大利润
一个存从后往前所有的最大利润
然后求两个数组的最大和

"""


class Solution:
    def maxProfit(self, prices):
        n = len(prices)
        if n <= 1: return 0
        p1 = [0] * n
        p2 = [0] * n
        low = prices[0]
        for i,x in enumerate(prices):
            low = min(x, low)
            p1[i] = max(p1[i-1], x - low)
        high = prices[-1]
        for i in range(n-2, -1, -1):
            high = max(prices[i], high)
            p2[i] = max(p2[i+1], high - prices[i])
        res = 0
        for i in range(n):
            res = max(res, p1[i] + p2[i])
        return res